package com.centriole.service.workflow.service;

import com.centriole.service.workflow.common.QueryVo;
import com.centriole.service.workflow.entity.*;
import com.centriole.service.workflow.entity.Process;
import com.centriole.service.workflow.enums.CancelTask;
import com.centriole.service.workflow.service.vo.CompleteTaskRequest;
import org.activiti.engine.history.HistoricProcessInstance;

import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**流程定义Service
 * @author wukai
 *
 */
public interface ProcessService {
	/**新增流程定义
	 * @param process
	 */
	public void insert(Process process);
	
	/**修改流程定义
	 * @param process
	 */
	public String editProcess(Process process) throws Exception;
	
	/**根据ID获取流程定义
	 * @return
	 */
	public Process selectById(String processId);
	
	/**根据流程名称查询流程定义
	 * @param processName
	 */
	public List<Process> select(String processName);
	
	
	/**
	 * 根据流程类型 查询流程
	 */
	public List<Process> listAll();
	
	
	/**获取已部署流程定义
	 * @return
	 */
	public List<Process> getDeployedProcess();
	
	/**部署流程
	 * @param processId
	 */
	public void deploy(String processId) throws Exception;
	
	/**逻辑删除
	 * @param processId
	 */
	public void logicDelete(String processId);
	
	/**暂停流程定义
	 * @param processId
	 */
	public void stop(String processId);
	
	/**激活流程定义
	 * @param processId
	 */
	public void run(String processId);
	
	/**物理删除
	 * @param processId
	 */
	public void delete(String processId);

	/**
	 * 启动流程
	 * @param proInstance
	 * @return	String	返回流程实例id
	 */
	public String start(ProInstance proInstance   , HttpServletRequest request);

	/**
	 * 获取待办任务
	 * @param appName	对外提供服务时的应用名
	 * @param userId		用户id
	 * @return
	 */
	public List<TaskModel> getTask( String appName , String userId );
	
	/**查询已办理
	 * @return
	 */
	public List<TaskModel> getDeal(QueryVo vo);
	/**查询我的流程
	 * @param isFinished
	 * @return
	 */
	public List<TaskModel> getMyProcess(String isFinished , QueryVo queryVo );
	/**根据流程实例ID查询历史
	 * @param instanceId
	 * @return
	 */
	public List<InstanceHistory> getHistory(String instanceId);
	
	/**根据流程实例ID查询原始流程图
	 * @param instanceId
	 * @return
	 */
	public String getBapBpmnByInstanceId(String instanceId);
	
	/**挂起流程
	 * @param instanceId
	 */
	public void suspendInstance(String instanceId);
	
	/**激活流程
	 * @param instanceId
	 */
	public void activateInstance(String instanceId);
	
	/**根据taskID获取task
	 * @param taskId
	 * @return
	 */
	public TaskModel getTaskByTaskId(String taskId);
	
	/**根据taskID获取前一步任务办理信息
	 * @param taskId
	 * @return
	 */
	public TaskModel getBeforTaskByTaskId(String taskId);

	/**
	 * 完成一个任务节点
	 * @param completeTaskRequest	 一个任务完成请求体
	 * @param userId						流程发起人
	 * @param approverId			审批人id(作为第三方的时候，审批人不会作从session中获取，而是从使用放传过来)
	 * @return
	 */
	public boolean useCompleteTask(CompleteTaskRequest completeTaskRequest, String userId ,String approverId);
	
	/**根据流程实例Id查询当前任务Code
	 * @param instanceId
	 * @param nodeId 
	 * @return
	 */
	public String getNodeCode(String instanceId, String nodeId);
	
	/**
	 * 撤销任务
	 * @param instanceId
	 * @param taskName
	 */
	CancelTask revokeInstance(String instanceId, String taskName);

	/**
	 * 终止流程
	 * @param instanceId
	 */
	void endActiviti(String instanceId);

	/**【如果是以审批任务结束】，那么获取到审批结果
	 * @param instanceId	实例Id

	 boolean getExamineResult(String instanceId);
	 */
	/**
	 * 如果存在审批回调接口，则从流程变量中获取该接口地址
	 * @param instanceId 流程实例id
	 * @return	String
	 */
	 String getApprCallBackUrl(Integer instanceId);

	/**
	 * 获取模型Id
	 * @param instanceId
	 * @return

	 String getModelId(Integer instanceId);
	 */
	/**
	 * 指定流程实例id 查询出 对应流程实例的流程变量map
	 * @param instanceId 流程实例id
	 * @return
	 */
	 Map<String,String> getVariables(String instanceId);


	Process selectByKey(String key);
}
